@tool
class_name AdditionalEffect
extends Resource

#region 属性
## 当Target销毁时，是否执行cancel_excute
@export var is_cancel_by_target_freed:bool = true
## 释放条件
@export var condition:Condition
var blackboard:Blackboard
# 成功添加过效果几次
var excuted_count:int = 0
# 这个对象可能是Entity，也可能是TileMapLayer和其它碰撞体
var target
# 一般表示持有这个额外方法的对象
var owner
var inited:bool = false
var args:Dictionary = {}
#endregion
#region 字段
#endregion
#region 信号
#endregion

#region 基类方法
#endregion
#region 公共方法
## 初始化
func init(args:Dictionary = {}) -> bool:
	if inited:
		return false
	blackboard = Blackboard.new(args)
	target = blackboard.get_value("Target")
	owner = blackboard.get_value("Owner")
	self.args = args.duplicate(false)
	if is_cancel_by_target_freed:
		if target is Entity:
			## 监听Target对象的存活，如果Target对象被标记为销毁时，直接执行cancel_excute
			target.destroying.connect(func():
				cancel_excute()
				)
	return true
## 检查能否执行添加效果，默认为true
func can_excute() -> bool:
	if condition != null and target is Entity:
		if not condition.check_result(target):
			return false
	return true
## 执行添加效果
func excute() -> bool:
	if can_excute():
		excuted_count += 1
		return true
	return false
## 取消执行的效果
func cancel_excute() -> bool:
	if excuted_count < 1:
		return false
	excuted_count -= 1
	return true
#endregion
#region 私有方法
func _init() -> void:
	if Engine.is_editor_hint():
		resource_local_to_scene = true
#endregion
#region 生命周期函数
#endregion
